package com.hyper_yang.javase.maps.hashMap;

import com.hyper_yang.javase.collections.pojo.Student;

import java.util.*;

public class TryHashMap {
    /*
        hashMap 特点都是由键决定的: 无序、不重复、无索引
                和 HashSet底层原理一样，都是哈希表结构
        1、创建对象时: 底层没有开辟空间，负载因子 0.75f
        2、添加数据时:
           2.1、首次添加数据     区别于 arraylist
                2.1.1、开辟数组空间: table 16
                2.1.2、threshold (扩容)阈值: 16 * 0.75 = 12
                2.1.3、key == null => 存储到下标 0的位置
           2.2、非首次添加数据
                2.2.1、计算后的位置没有值，直接添加节点
                2.2.2、指定位置有值，hash相同、key相同: key的value进行更新
                2.2.3、指定位置有值，hash相同、key不同: 头插法(jdk 7)、尾插法(jdk 8)
           2.3、扩容和树化（链表转换为红黑树）
                扩容: 数组元素个数 size >= threshold  ==>  size << 1;
                树化: 一个位置的元素链表达到了 8，且数组的长度 >= 64,会转为红黑树。
                反树化: UNTREEIFY_THRESHOLD = 6;
            static final float DEFAULT_LOAD_FACTOR = 0.75f;
            static final int TREEIFY_THRESHOLD = 8;
            static final int UNTREEIFY_THRESHOLD = 6;
            static final int MIN_TREEIFY_CAPACITY = 64;

          核心点: HashMap的键的位置如果存储的是自定义对象，需要重写 hashCode和 equals方法
     */
    public static void main(String[] args) {
        // 80名同学 对 4个景点 意向投票
        String[] arr = {"A", "B", "C", "D"}; // 4个景点
        ArrayList<String> list = new ArrayList<>(); // 存票
        Random random = new Random();
        for (int i = 0; i < 80; i++) { // 80个同学
            int index = random.nextInt(arr.length);
            list.add(arr[index]);
        }

        HashMap<String,Integer> hashMap = new HashMap<>();

        for (String ticket : list) {
            if (!hashMap.containsKey(ticket)) {
                hashMap.put(ticket, 1);
            } else {
                int count = hashMap.get(ticket);
                count += 1;
                hashMap.put(ticket,count);
            }
        }

        System.out.println(hashMap);

        int max = 0;
        Set<Map.Entry<String, Integer>> entries = hashMap.entrySet();
        for (Map.Entry<String, Integer> entry : entries) {
            if (entry.getValue() > max) {
                max = entry.getValue();
            }
        }

        System.out.println(max);

        for (Map.Entry<String, Integer> entry : entries) {
            if (entry.getValue() == max) {
                System.out.println(entry.getKey());
            }
        }

//        HashMap<Student,String> hashMap = new HashMap<>();
//
//        Student stu1 = new Student("zhangsan",23);
//        Student stu2 = new Student("lisi",24);
//        Student stu3 = new Student("wangwu",25);
//
//        hashMap.put(stu1,"杭州");
//        hashMap.put(stu2,"深圳");
//        hashMap.put(stu3,"江苏");
//
//        for (Student student : hashMap.keySet()) {
//            String value = hashMap.get(student);
//            System.out.println(student.getName() + "的籍贯是: " + value);
//        }

    }
}
